// // #include <iostream>
// // using namespace std;

// // class Person {
// //     public:
// //     virtual void BuyTicker() {
// //         cout << "买全价票" << endl;
// //     }
// // };
// // int main() {
// //     return 0;
// // }

// #include <cstddef>
// #include <iostream>
// using namespace std;
// class A{};
// class B : public A{};
// class Animal {
//     public:
//         virtual A* talk() const {
//             cout << "不知道" << endl;
//             return nullptr;
//         }
// };
// class Dog : public Animal {
//     public:
//         virtual B* talk() const {
//             cout << "汪汪" << endl;
//             return nullptr;
//         }
// };
// // class Cat : public Animal {
// //     public:
// //         virtual void talk() const {
// //             cout << "(>^ω^) 喵" << endl;
// //         }
// // };
// // void Listen(const Animal& animal) {
// //     animal.talk();
// // }
// void Listen(const Animal* animal){
//     animal->talk();
// }
// int main() {
//     // Cat cat;
//     Dog dog;
//     // Listen(cat);
//     // Listen(&cat);
//     // Listen(dog);
//     Listen(&dog);
//     return 0;
// }

// class A {
// public:
//   virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//   virtual void test() { func(); }
// };

// class B : public A {
// public:
//   void func(int val = 0) { std::cout << "B->" << val << std::endl; }
// };

// int main(int argc, char *argv[]) {
//   B *p = new B;
//   p->test();
//   return 0;
// }

// #include <iostream>
// using namespace std;
// class A {
//     public:
//         virtual ~A() {
//             cout << "~A()" << endl;
//         }
// };
// class B : public A {
//     public:
//         ~B() {
//             cout << "~B()" << _p << endl;
//         }
//     protected:
//         int* _p = new int[10];
// };
// int main() {
//     A* p1 = new A;
//     A* p2 = new B;
//     delete p1;
//     delete p2;
//     return 0;
// }

// #include <iostream>
// using namespace std;
// class Car {
//     public:
//     virtual void Drive() final {}
// };
// class BWM : public Car {
//     public:
//         virtual void Drive() {
//             cout << "BWM好开" << endl;
//         }
// };
// int main() {
//     return 0;
// }

#include <iostream>
using namespace std;
// class Car {
//     public:
//         virtual void Drive() = 0;
// };
// class BWM : public Car {
//     public:
//         virtual void Drive() {
//             cout << "宝马好开" << endl;
//         }
// };
// class BENZ : public Car {
//     public:
//         virtual void Drive() {
//             cout << "奔驰好开" << endl;
//         }
// };

// int main() {
//     Car car; // 报错

//     Car* car_bwm = new BWM;
//     car_bwm->Drive();
//     Car* car_benz = new BENZ;
//     car_benz->Drive();
//     return 0;
// }

// class Car {
//     public:
//         virtual void Drive(){
//             cout << "Drive()" << endl;
//         }
//     private:
//         int x = 1;
//         char _c = 'A';
// };

// int main() {
//     Car b;
//     cout << sizeof(b) << endl;
//     return 0;
// }
// class Person {
//     public:
//         virtual void BuyTicket() {
//             cout << "买全价票" << endl;
//         }
// };
// class Student : public Person {
//     public:
//         virtual void BuyTicket() {
//             cout << "买半价票" << endl;
//         }
// };
// class Soldier : public Person {
//     public:
//         virtual void BuyTicket() {
//             cout << "不需买票" << endl;
//         }
// };
// void Func(Person* ptr) {
//     ptr->BuyTicket();
// }
// int main() {
//     Person ps;
//     Student st;
//     Soldier so;
//     Func(&ps);
//     Func(&st);
//     Func(&so);
//     return 0;
// }
class Base {

public:
  virtual void func1() { cout << "Base::func1" << endl; }
  virtual void func2() { cout << "Base::func2" << endl; }
  void func5() { cout << "Base::func5" << endl; }

protected:
  int a = 1;
};

class Derive : public Base {

public:
  // 重写基类的func1
  virtual void func1() { cout << "Derive::func1" << endl; }
  virtual void func3() { cout << "Derive::func1" << endl; }
  void func4() { cout << "Derive::func4" << endl; }

protected:
  int b = 2;
};

int main() {
  int i = 0;
  static int j = 1;
  int *p1 = new int;
  const char *p2 = "xxxxxxxx";
  printf("栈:%p\n", &i);
  printf("静态区:%p\n", &j);
  printf("堆:%p\n", p1);
  printf("常量区:%p\n", p2);
  Base b;
  Derive d;
  Base *p3 = &b;
  Derive *p4 = &d;
  printf("Person虚表地址:%p\n", *(int *)p3);
  printf("Student虚表地址:%p\n", *(int *)p4);
  printf("虚函数地址:%p\n", &Base::func1);
  printf("普通函数地址:%p\n", &Base::func5);

  return 0;
}
